import Reporter from './reporter';

// 错误监控类
class ErrorMonitor {
  constructor(options) {
    this.options = options;                    // 存储配置项
    this.reporter = new Reporter(options);     // 创建数据上报实例
    this.init();   // 执行初始化
  }

  // 初始化所有错误监控
  init() {
    this.handleJSError();         // 处理 JS 运行时错误
    this.handlePromiseError();    // 处理 Promise 异常
    this.handleResourceError();   // 处理资源加载错误
  }

  // 监控 JS 运行时错误
  handleJSError() {
    window.onerror = (message, source, lineno, colno, error) => {
      const errorInfo = {
        type: 'js',                // 错误类型
        message,                   // 错误信息
        source,                    // 错误文件
        lineno,                    // 行号
        colno,                     // 列号
        stack: error?.stack,       // 错误堆栈
        userAgent: navigator.userAgent,  // 浏览器信息
        timestamp: Date.now()      // 错误发生时间
      };
      this.reporter.send('error', errorInfo);
    };
  }

  // 监控 Promise 未捕获的异常
  handlePromiseError() {
    window.addEventListener('unhandledrejection', (event) => {
      const errorInfo = {
        type: 'promise',           // 错误类型
        message: event.reason?.message || event.reason,  // 错误信息
        stack: event.reason?.stack,                     // 错误堆栈
        userAgent: navigator.userAgent,                 // 浏览器信息
        timestamp: Date.now()                          // 错误发生时间
      };
      this.reporter.send('error', errorInfo);
    });
  }

  // 监控资源加载错误
  handleResourceError() {
    window.addEventListener('error', (event) => {
      if (event.target && (event.target.src || event.target.href)) {
        const errorInfo = {
          type: 'resource',        // 错误类型
          url: event.target.src || event.target.href,  // 资源地址
          tagName: event.target.tagName,               // 标签名
          userAgent: navigator.userAgent,              // 浏览器信息
          timestamp: Date.now()                        // 错误发生时间
        };
        this.reporter.send('error', errorInfo);
      }
    }, true);  // 使用捕获阶段以确保能捕获到资源加载错误
  }
}

export default ErrorMonitor; 